/*
 * @Descripttion: GOGOGO
 * @version: 1.0.0
 * @Author: XJM
 * @Date: 2022-08-18 13:55:23
 * @LastEditors: XJM
 * @LastEditTime: 2022-08-22 21:24:57
 */
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const Strategy = require('passport-http-bearer').Strategy;

var jwt = require("jsonwebtoken");

var _ = require('lodash');

var jwt_config = require("config").get("jwt_config");

// 通过登录函数初始化
/**
 * 初始化 passport 框架
 * 
 * @param  {[type]}   app       全局应用程序
 * @param  {[type]}   loginFunc 登录函数
 * @param  {Function} callback  回调函数
 */
module.exports.setup = function (app, loginFunc, callback) {
	// 用户名密码 登录策略
	passport.use(new LocalStrategy(
		function (username, password, done) {
			if (!loginFunc) return done("登录验证函数未设置");

			loginFunc(username, password, function (err, user) {
				if (err) return done(err);
				return done(null, user);
			});
		})
	);

	// token 验证策略
	passport.use(new Strategy(
		function (token, done) {
			jwt.verify(token, jwt_config.get("secretKey"), function (err, decode) {
				if (err) { return done("验证错误"); }
				return done(null, decode);
			});
		}
	));

	// 初始化passport模块
	app.use(passport.initialize());

	if (callback) callback();
};

/**
 * 登录验证逻辑
 * 
 * @param  {[type]}   req  请求
 * @param  {[type]}   res  响应
 * @param  {Function} next [description]
 */
module.exports.login = function (req, res, next) {

	passport.authenticate('local', function (err, user, info) {

		if (err) return res.sendResult(null, 400, err);
		if (!user) return res.sendResult(null, 400, "参数错误");

		// 获取角色信息
		var token = jwt.sign({ "uid": user.id, "rid": user.rid }, jwt_config.get("secretKey"), { "expiresIn": jwt_config.get("expiresIn") });
		user.token = "Bearer " + token;
		return res.sendResult(user, 200, '登录成功');
	})(req, res, next);

}

/**
 * token验证函数
 * 
 * @param  {[type]}   req  请求对象
 * @param  {[type]}   res  响应对象
 * @param  {Function} next 传递事件函数
 */
module.exports.tokenAuth = function (req, res, next) {
	passport.authenticate('bearer', { session: false }, function (err, tokenData) {
		if (err) return res.sendResult(null, 400, '数据请求失败!请刷新重试');
		if (!tokenData) return res.sendResult(null, 400, '数据请求失败!请刷新重试');
		req.userInfo = {};
		req.userInfo.uid = tokenData["uid"];
		req.userInfo.rid = tokenData["rid"];
		next();
	})(req, res, next);
}
